/* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <string.h>
#include "rom/ets_sys.h"
#include "esp_wifi.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "lwip/ip_addr.h"


#define EXAMPLE_SSID_LEN     32 // SSID最大长度
#define EXAMPLE_PASSWORD_LEN 64 // 密码最大长度

static const char *TAG = "wifi"; // 日志标签

static int s_retry_num = 0; // 当前重试连接次数计数器


/**
 * @brief 从NVS获取字符串值的日志记录函数
 * @param err 操作错误码
 * @param key 键名
 * @param value 获取到的值
 */
static void nvs_get_str_log(esp_err_t err, char *key, char *value)
{
    switch (err) {
        case ESP_OK:
            ESP_LOGI(TAG, "%s = %s", key, value); // 成功获取值
            break;
        case ESP_ERR_NVS_NOT_FOUND:
            ESP_LOGI(TAG, "%s : Can't find in NVS!", key); // 键不存在
            break;
        default:
            ESP_LOGE(TAG, "Error (%s) reading!", esp_err_to_name(err)); // 其他错误
    }
}

/**
 * @brief 向NVS存储字符串值
 * @param key 键名
 * @param value 要存储的值
 * @return esp_err_t 错误码
 */
static esp_err_t from_nvs_set_value(char *key, char *value)
{
    nvs_handle_t my_handle;
    // 打开NVS存储器
    esp_err_t err = nvs_open("memory", NVS_READWRITE, &my_handle);
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "Error (%s) opening NVS handle!\n", esp_err_to_name(err));
        return ESP_FAIL;
    } else {
        // 设置键值对
        err = nvs_set_str(my_handle, key, value);
        ESP_LOGI(TAG, "set %s is %s!,the err is %d\n", key, (err == ESP_OK) ? "succeed" : "failed", err);
        nvs_close(my_handle); // 关闭NVS
        ESP_LOGI(TAG, "NVS close Done\n");
    }
    return ESP_OK;
}

/**
 * @brief 从NVS获取字符串值
 * @param key 键名
 * @param value 存储获取值的缓冲区
 * @param size 缓冲区大小（输入时）/实际获取值大小（输出时）
 * @return esp_err_t 错误码
 */
static esp_err_t from_nvs_get_value(char *key, char *value, size_t *size)
{
    nvs_handle_t my_handle;
    // 打开NVS存储器
    esp_err_t err = nvs_open("memory", NVS_READWRITE, &my_handle);
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "Error (%s) opening NVS handle!\n", esp_err_to_name(err));
        return ESP_FAIL;
    } else {
        // 获取键值
        err = nvs_get_str(my_handle, key, value, size);
        nvs_get_str_log(err, key, value); // 记录日志
        nvs_close(my_handle);             // 关闭NVS
    }
    return err;
}

/**
 * @brief 设置WiFi配置并保存到NVS
 * @param mode WiFi模式（"ap", "sta", "apsta"）
 * @param ap_ssid AP模式的SSID
 * @param ap_passwd AP模式的密码
 * @param sta_ssid STA模式要连接的SSID
 * @param sta_passwd STA模式要连接的密码
 * @return esp_err_t 错误码
 */
esp_err_t app_wifi_set_wifi(char *mode, char *ap_ssid, char *ap_passwd, char *sta_ssid, char *sta_passwd)
{
    // 根据模式参数设置NVS中的WiFi模式
    if (!strcmp(mode, "ap")) {
        from_nvs_set_value("wifimode", "ap");
    } else if (!strcmp(mode, "sta")) {
        from_nvs_set_value("wifimode", "sta");
    } else if (!strcmp(mode, "apsta")) {
        from_nvs_set_value("wifimode", "apsta");
    } else {
        return ESP_FAIL; // 无效的模式参数
    }

    // 保存AP和STA的配置到NVS
    from_nvs_set_value("apssid", ap_ssid);
    from_nvs_set_value("appasswd", ap_passwd);
    from_nvs_set_value("stassid", sta_ssid);
    from_nvs_set_value("stapasswd", sta_passwd);
    return ESP_OK;
}
